home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
docs
/
ippon
/
data
/
etc
/
lboss04.lzh
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-05-18
|
5KB
|
252 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <XSP2lib.H>
#include <pcm8afnc.h>
#include <sys/dos.h>
#include <sys/iocs.h>
#include "main.h"
#include "fxsp2lib.h"
#define PCG_MAX 1024 /* スプライトPCGパターン最大使用数 */
#define REF_MAX 1024 /* 複合スプライトリファレンスデータ最大使用数 */
#define FRM_MAX 1024 /* 複合スプライトフレームデータ最大使用数 */
#define RGB(r,g,b) ((g)<<11|(r)<<6|(b)<<1)
static char pcg_alt[PCG_MAX + 1]; /* PCG配置管理テーブル */
static char pcg_dat[PCG_MAX * 128]; /* PCGデータファイル読み込みバッファ */
static int old_crtmod;
char f_option_flag = 0;
char end_of_data = 0;
void usage (void)
{
printf ("中ボステストパターン表示&作成 main.x ver0.01\n"
" programmed by Mitsuky <FreeSoftware>\n"
);
}
/* 起動時のファイル読み込み */
/* 読み込みに失敗した場合はいきなり終了するので注意 */
int load_file (char *fname, void *ptr, size_t size, size_t n)
{
FILE *fp;
int i;
if ((fp = fopen (fname, "rb")) == NULL) {
//fatal_error (ERROR_FILE, fname);
printf ("%s が読めません\n", fname);
}
i = fread (ptr, size, n, fp);
fclose (fp);
return (i); /* 返り値は読み込みバイト数 */
}
void wait_vdisp (void)
{
int sp;
sp = _iocs_b_super (0);
while ((*(volatile unsigned char *) 0xe88001) & 0x10 == 0);
while ((*(volatile unsigned char *) 0xe88001) & 0x10);
_iocs_b_super (sp);
}
void init (void)
{
int i, sp;
unsigned short *s, *d;
unsigned short pal_dat[16 * 15]; /* パレットデータファイル読み込みバッファ */
unsigned short crtcdata[9] =
{69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 785};
unsigned short textpalet[16] =
{0, RGB (16, 16, 20), RGB (12, 12, 20), RGB (28, 28, 31), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
old_crtmod = _iocs_crtmod (-1);
_iocs_b_curoff ();
wait_vdisp ();
_iocs_crtmod (14); /* 256*256dot 31kHz 65536色 */
_iocs_g_clr_on ();
_iocs_b_curoff ();
_iocs_ms_curof ();
_iocs_skey_mod (0, 0, 0);
//sp = _iocs_b_super (0);
//*(unsigned short *) 0xe82600 &= 0xff80; /* 画面表示全オフ */
//_iocs_b_super (sp);
_iocs_sp_init ();
_iocs_sp_on (); /* スプライト表示をON */
_iocs_bgctrlst (0, 0, 0); /* BG0表示OFF */
_iocs_bgctrlst (1, 1, 0); /* BG1表示OFF */
/* 256x256 正方形モードを作る */
sp = _iocs_b_super (0);
*(unsigned short *) 0xe80028 = crtcdata[8];
d = (unsigned short *) 0xe80002;
for (i = 1; i < 8; i++)
*d++ = crtcdata[i];
*(unsigned short *) 0xe80000 = crtcdata[0];
*(unsigned short *) 0xe8e006 |= 0b10; /* HRL ビット */
*(unsigned short *) 0xeb080c = crtcdata[2] + 4;
*(unsigned short *) 0xeb080a = crtcdata[0]; /* スプライト */
*(unsigned short *) 0xeb080e = crtcdata[6];
*(unsigned short *) 0xe82500 = 0b01001001001110; /* 優先順位 TX>SP>GR */
_iocs_b_super (sp);
load_file ("LBOSS04.SP", pcg_dat, sizeof (char), 128 * PCG_MAX);
load_file ("otoko.PAL", pal_dat, 2, 16 * 15);
/* パレットに転送 */
sp = _iocs_b_super (0);
s = (unsigned short *) 0xe82200;
for (i = 0; i < 16; i++)
*s++ = textpalet[i];
d = pal_dat;
for (i = 0; i < 15 * 16; i++)
*s++ = *d++;
_iocs_b_super (sp);
{
struct _lineptr lp;
lp.x1 = 0;
lp.y1 = 128;
lp.x2 = 255;
lp.y2 = 128;
lp.color = 0xf800;
lp.linestyle = 0xaaaa;
_iocs_line (&lp);
lp.x1 = 128;
lp.y1 = 0;
lp.x2 = 128;
lp.y2 = 255;
_iocs_line (&lp);
}
seq_init0 ();
EnemyInit0 ();
_dos_breakck (2); /* BREAK チェックを殺す */
if (f_option_flag)
fxsp_on ();
xsp_on ();
xsp_mode (2);
xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
//xsp_objdat_set (ref_dat);
//pcm8a_vsyncint_on ();
//sp = _iocs_b_super (0);
//*(unsigned short *) 0xe82600 |= 0x007f; /* 画面表示オン */
//_iocs_b_super (sp);
}
int tini (void)
{
int sp;
//pcm8a_vsyncint_off ();
xsp_off ();
if (f_option_flag){
fxsp_off ();
fcloseall();
}
EnemyTini ();
wait_vdisp ();
sp = _iocs_b_super (0);
*(unsigned short *) 0xe8e006 &= 0xfffd; /* HRL ビット */
_iocs_b_super (sp);
_iocs_skey_mod (-1, 0, 0);
_iocs_b_curon ();
_iocs_crtmod (old_crtmod);
return (0);
}
void game (void)
{
seq_init ();
for (;;) {
do {
seq_move ();
EnemyMove ();
xsp_out ();
if (f_option_flag)
fxsp_out ();
if (f_option_flag && end_of_data)
break;
} while ((_iocs_ms_getdt ()& 0xffff) == 0);
if (f_option_flag || (_iocs_ms_getdt ()& 0x00ff))
break;
EnemyTini ();
seq_init ();
}
}
int main (int argc, char *argv[])
{
int i;
int slash_flag = 0;
int fname_found_flag = 0; /* ファイル名が1つでもあったか */
{
char *temp;
temp = getenv ("SLASH");
if ((temp != NULL) && (*temp == '/')) {
slash_flag = 1;
}
}
for (i = 1; i < argc; i++) {
if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
switch (*(argv[i] + 1)) {
case 'f':
case 'F':
f_option_flag = !0;
break;
default:
usage ();
return (-1);
}
} else {
fname_found_flag = 1;
}
}
#if 0
if (fname_found_flag == 0) {
usage ();
return (-1);
}
#endif
init ();
game ();
tini ();
return (0);
}